2019-2-19 Haskell学习笔记

因为Lyzh大佬的安利作死想了解下Haskell语言于是就有了这个坑 :cry:

haskell中不存在0为False 其他数为True这么一说 具体如下

1
True && 11

:10:9: error:
? No instance for (Num Bool) arising from the literal ‘11’
? In the second argument of ‘(&&)’, namely ‘11’
In the expression: True && 11
In an equation for ‘it’: it = True && 11

1
True && 0

:11:9: error:
? No instance for (Num Bool) arising from the literal ‘0’
? In the second argument of ‘(&&)’, namely ‘0’
In the expression: True && 0
In an equation for ‘it’: it = True && 0

> Haskell的运算中实际上是没有负数这么一说负数相当于正数再加(-)
> 所以出现如下现象
1
2
orochi> 1-2
-1
1
2
3
4
5
6
7
8
orochi> 1+-2

<interactive>:50:2: error:
? Variable not in scope: (+-) :: Integer -> Integer -> t
? Perhaps you meant one of these:

‘++’ (imported from Prelude), ‘+’ (imported from Prelude),
‘-’ (imported from Prelude)

再举个运算符优先级的例子

1
2
3
4
ghci> 1 + (4 * 4)
17
ghci> 1 + 4 * 4
17

这个例子里面一个使用了括号运算符一个没有使用但是结果一样 原因如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
orochi> :info (+)
class Num a where
(+) :: a -> a -> a
...
-- Defined in ‘GHC.Num’
infixl 6 +

orochi> :info (*)
class Num a where
...
(*) :: a -> a -> a
...
-- Defined in ‘GHC.Num’
infixl 7 *

可以看到通过交互式终端GHCI + 符号返回了6
* 号通过交互式终端GHCI返回了7
7>6所以先执行了乘号

为了证明此解释 我们使用返回值为8的 ^ 符号进行测试

1
2
3
4
5
(^) :: (Num a, Integral b) => a -> b -> a 	-- Defined in ‘GHC.Real’
infixr 8 ^

orochi> 2^3 * 3 + 1
25

可以看到先执行了^之后执行了*最后执行的+